/**
 * Create a basic component with common options
 */
import '../../locale';
import {camelize} from '../format/string';
import {SlotsMixin} from '../../mixins/slots';

function install(Vue) {
    var name = this.name;
    Vue.component(name, this);
    Vue.component(camelize("-" + name), this);
} // unify slots & scopedSlots


export function unifySlots(context) {
    // use data.scopedSlots in lower Vue version
    var scopedSlots = context.scopedSlots || context.data.scopedSlots || {};
    var slots = context.slots();
    Object.keys(slots).forEach(function (key) {
        if (!scopedSlots[key]) {
            scopedSlots[key] = function () {
                return slots[key];
            };
        }
    });
    return scopedSlots;
} // should be removed after Vue 3

function transformFunctionComponent(pure) {
    return {
        functional: true,
        props: pure.props,
        model: pure.model,
        render: function render(h, context) {
            return pure(h, context.props, unifySlots(context), context);
        }
    };
}

export function createComponent(name) {
    return function (sfc) {
        if (typeof sfc === 'function') {
            sfc = transformFunctionComponent(sfc);
        }

        if (!sfc.functional) {
            sfc.mixins = sfc.mixins || [];
            sfc.mixins.push(SlotsMixin);
        }

        sfc.name = name;
        sfc.install = install;
        return sfc;
    };
}